/**
 * axios封装
 * 请求拦截、响应拦截、错误统一处理
 */
import axios from "axios";
// import QS from "qs";
import router from "../../router/index";
import store from "../../store/index";
import httpUrl from "./httpUrl";

if (process.env.NODE_ENV == "development") {
	axios.defaults.baseURL = httpUrl.devUrl;
	// axios.defaults.withCredentials = true;
} else if (process.env.NODE_ENV == "production") {
	axios.defaults.baseURL = httpUrl.prodUrl;
	// axios.defaults.withCredentials = true
}

// /**
//  * 提示函数
//  * 禁止点击蒙层、显示一秒后关闭
//  */
// const tip = (msg) => {
// 	Toast({
// 		message: msg,
// 		duration: 1000,
// 		forbidClick: true,
// 	});
// };

/**
 * 跳转登录页
 * 携带当前页面路由，用以在登录页面完成登录后返回当前页面
 */
const toLogin = () => {
	router.replace(
		{
			path: "/login",
			query: {
				redirect: router.currentRoute.fullPath,
			},
		},
		(onComplete) => {
			console.log(onComplete);
		},
		(onabort) => {
			console.log(onabort);
		}
	);
};
/**
 * 跳转licence页面
 * 携带当前页面路由，用以在licence页面完成授权后返回当前页面
 */
// const toLicence = () => {
// 	router.replace(
// 		{
// 			name: "Licence",
// 			params: {
// 				redirect: router.currentRoute.fullPath,
// 			},
// 		},
// 		(onComplete) => {
// 			console.log(onComplete);
// 		},
// 		(onabort) => {
// 			console.log(onabort);
// 		}
// 	);
// };

/**
 * 请求失败后的错误统一处理
 * @param {Number} status 请求失败的状态码
 */
const errorHandle = (status, other) => {
	// 状态码判断
	switch (status) {
		// 401: 未登录状态，跳转登录页
		case 401:
			toLogin();
			break;
		// 403 token过期，清除token并跳转登录页
		case 403:
			localStorage.removeItem("token");
			store.commit("set_token", null);
			setTimeout(() => {
				toLogin();
			}, 1000);
			break;
		// 404请求不存在
		case 404:
			alert("请求的资源不存在");
			break;
		case 9000:
			localStorage.removeItem("token");
			store.commit("set_token", null);
			setTimeout(() => {
				toLogin();
			}, 1000);
			break;
		default:
			// alert("否则浏览器自动返回的状态码...");
			console.log(other);
	}
};
// axios.defaults.withCredentials = true;
// 创建axios实例
var instance = axios.create({
	timeout: 1000 * 60,
	// withCredentials: true,
});
// 设置post请求头
instance.defaults.headers.post["Content-Type"] = "application/json";

/**
 * 请求拦截器
 * 每次请求前，如果存在token则在请求头中携带token
 */
instance.interceptors.request.use(
	(config) => {
		// 登录流程控制中，根据本地是否存在token判断用户的登录情况
		// 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token
		// 后台根据携带的token判断用户的登录情况，并返回给我们对应的状态码
		// 而后我们可以在响应拦截器中，根据状态码进行一些统一的操作。
		const token = store.state.token || localStorage.getItem("token");
		token && (config.headers.Authorization = token);
		console.log("请求拦截器---拦截成功...");
		console.log(token);
		// if (config.method === "get") {
		// 	config.data = { unused: 0 }; // 这个是关键点，加入这行就可以了,解决get,请求添加不上Content-Type
		// }
		// if (config.url == "/getLicence" && config.method === "get") {
		// 	config.headers["Content-Type"] = "application/octet-stream;charset=UTF-8";
		// }
		if (
			(config.url == "/clientUpgradeFile" && config.method === "post") ||
			(config.url == "/platformFile" && config.method === "post") ||
			(config.url == "/importTerminalBatch" && config.method === "post") ||
			(config.url == "/uploadMapFile" && config.method === "post") ||
			(config.url == "/uploadDangerImage" && config.method === "post") ||
			// 图片上传后拿到图片id才添加白名单图库---添加
			(config.url == "/addDangerImage" && config.method === "post") ||
			// 图片上传后拿到图片id才添加白名单图库---编辑
			(config.url == "/upDangerImage" && config.method === "post") ||
			// licence文件上传
			(config.url == "/uploadLicenseFile" && config.method === "post") ||
			// 系统还原
			(config.url == "/importSql" && config.method === "post")
		) {
			config.headers["Content-Type"] = "multipart/form-data;charset=utf-8";
		}
		if (
			config.url == "/exportWaring" ||
			config.url == "/exportPublishContent" ||
			config.url == "/exportInternalAudit" ||
			config.url == "/verifyCode" ||
			config.url == "/exportTerminalBoXlsx" ||
			config.url == "/exportSql"||
			config.url == "/downloadLightWarning" ||
			config.url == "/exportApproveLog" ||
			config.url == "/exportSimHistory"
		) {
			config.responseType = "blob";
		}
		console.log(config);
		return config;
	},
	(error) => {
		console.log("请求拦截器---拦截失败...");
		console.log(error);
		return Promise.error(error);
	}
);

// 响应拦截器
instance.interceptors.response.use(
	// 请求成功
	(res) => {
		console.log("响应拦截器---拦截成功...");
		console.log(res);
		console.log(res.headers);
		console.log(res.headers["content-disposition"]);
		if (res.status === 200) {
			// 屏蔽licence
			// if (res.data.code == 10000) {
			// 	toLicence();
			// 	return Promise.reject(res);
			// }
			return Promise.resolve(res);
		} else {
			return Promise.reject(res);
		}
	},
	// 请求失败
	(error) => {
		console.log("响应拦截器---拦截失败...");
		console.log(error);
		if (error.request) {
			// 请求已发出，但是不在2xx的范围
			errorHandle(error.request.status, error.message);
			return Promise.reject(error);
		} else {
			// 服务器没有返回结果
			return Promise.reject(error);
		}
	}
);

/**
 * get方法，对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function get(url, params) {
	if (url == "/exportWaring" || url == "/exportPublishContent" || url == "/exportInternalAudit" || url == "/verifyCode" || url == "/exportTerminalBoXlsx" || url == "/exportSql" || url == "/downloadLightWarning" || url == "/exportApproveLog" || url == "/exportSimHistory") {
		return new Promise((resolve, reject) => {
			instance
				.get(url, {
					params: params,
				})
				.then((res) => {
					resolve(res);
				})
				.catch((err) => {
					reject(err);
				});
		});
	} else {
		return new Promise((resolve, reject) => {
			instance
				.get(url, {
					params: params,
				})
				.then((res) => {
					resolve(res.data);
				})
				.catch((err) => {
					reject(err.data);
				});
		});
	}
}
/**
 * post方法，对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function post(url, params) {
	return new Promise((resolve, reject) => {
		instance
			// .post(url, QS.stringify(params))
			.post(url, params)
			.then((res) => {
				resolve(res.data);
			})
			.catch((err) => {
				reject(err.data);
			});
	});
}
